﻿/*****************************************************************//**
 *
 * @file   FITKAbaqusAdaptorOutput.h
 * @brief  Abaqus Output 适配器 用于读取INP过程中的Output解析。
 * @author fulipeng (flipengqd@yeah.net)
 * @date   2024-04-16
 *
 *********************************************************************/
#ifndef __FITKABAQUSADAPTOROUTPUT__H__
#define __FITKABAQUSADAPTOROUTPUT__H__

#include "FITKAbaqusIOINPAPI.h"
#include "FITKAbaqusAbstractAdaptor.h"
#include "FITK_Kernel/FITKAdaptor/FITKIOAdaptorFactory.h"
 //前置声明
ForwardDeclarNS(AbaqusData, FITKDataCase)
ForwardDeclarNS(Interface, FITKAbaAssembly)
ForwardDeclarNS(Interface, FITKComponentManager)
ForwardDeclarNS(Interface, FITKAbaAbstractStep)
ForwardDeclarNS(Interface, FITKAbaAbstractOutput)

namespace IO
{
    /**
     * @brief Abaqus Output 读写适配器
     * @author fulipeng (fulipengqd@yeah.net)
     * @date 2024-03-26
     */
    class FITKAbaqusIOINPAPI FITKAbaqusAdaptorOutput : public FITKAbaqusAbstractAdaptor
    {
    public:
        explicit FITKAbaqusAdaptorOutput() = default;
        ~FITKAbaqusAdaptorOutput() = default;


        /**
         * @brief 获取适配器数据类型名
         * @return 适配器数据类型名
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        QString getAdaptorClass() override;

        /**
         * @brief 设置算例数据对象
         * @param caseData
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        void setCaseData(AbaqusData::FITKDataCase* caseData);

        /**
         * @brief 设置分析步数据
         * @param stepData 分析步
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-18
         */
        void setStepData(Interface::FITKAbaAbstractStep* stepData);

        /**
         * @brief 适配器读取
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        bool adaptR() override;

        /**
         * @brief 适配器写出
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-03-26
         */
        bool adaptW() override;

    private:

        /**
         * @brief 读取场输出
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-15
         */
        bool readField();

        /**
         * @brief 读取历程输出
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-12
         */
        bool readHistory();

        /**
         * @brief 写出Field
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-12
         */
        bool writeField();

        /**
         * @brief 写出History
         * @return 状态 true成功， false失败
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-12
         */
        bool writeHistory();

        /**
         * @brief 设置分析步结束状态ID
         * @param type 1 field 2 history
         * @param stepID StepID
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-05-06
         */
        void setOutputDeactiveStepR(int type, int stepID);

    private:

        /**
         * @brief 算例数据
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-13
         */
        AbaqusData::FITKDataCase* _caseData{};

        /**
         * @brief 分析步（Step）数据
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-18
         */
        Interface::FITKAbaAbstractStep* _stepData{};

        /**
         * @brief 输出数据
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-12
         */
        Interface::FITKAbaAbstractOutput* _outputData{};

        /**
         * @brief 是否显式分析
         * @author fulipeng (fulipengqd@yeah.net)
         * @date 2024-04-12
         */
        bool _isExplicit = false;
    };

    Register2FITKIOAdaptorFactory(INP, Interface::FITKAbaAbstractOutput, FITKAbaqusAdaptorOutput, 1);

}

#endif